home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / xb / fncsrc / dosfnc.has next >
Encoding:
Text File  |  1996-12-11  |  6.0 KB  |  395 lines

  1.  
  2.     .include    doscall.mac
  3.     .include    fefunc.h
  4.     .include    fdef.h
  5.  
  6.  
  7.     .text
  8.     .even
  9.  
  10.     .dc.l    ret
  11.     .dc.l    ret
  12.     .dc.l    ret
  13.     .dc.l    ret
  14.     .dc.l    ret
  15.     .dc.l    ret
  16.     .dc.l    ret
  17.     .dc.l    ret
  18.     .dc.l    ptr_token
  19.     .dc.l    ptr_param
  20.     .dc.l    ptr_exec
  21.     .dc.l    0,0,0,0,0
  22.  
  23. ret:
  24.     rts
  25. ptr_token:
  26.     .dc.b    'drvctrl',0
  27.     .dc.b    'chgdir',0
  28.     .dc.b    'curdir',0
  29.     .dc.b    'filesnum',0
  30.     .dc.b    'files',0
  31.     .dc.b    'getenv',0
  32.     .dc.b    'setenv',0
  33.     .dc.b    '_system',0
  34.     .dc.b    0
  35.     .even
  36. ptr_param:
  37.     .dc.l    p_drvctrl
  38.     .dc.l    p_chgdir
  39.     .dc.l    p_curdir
  40.     .dc.l    p_filesnum
  41.     .dc.l    p_files
  42.     .dc.l    p_getenv
  43.     .dc.l    p_setenv
  44.     .dc.l    p_system
  45. ptr_exec:
  46.     .dc.l    e_drvctrl
  47.     .dc.l    e_chgdir
  48.     .dc.l    e_curdir
  49.     .dc.l    e_filesnum
  50.     .dc.l    e_files
  51.     .dc.l    e_getenv
  52.     .dc.l    e_setenv
  53.     .dc.l    e_system
  54.  
  55.  
  56. **    **    **    **    **    **    **    **    **    **
  57.  
  58. p_drvctrl:
  59.     .dc.w    int_val
  60.     .dc.w    str_omt
  61.     .dc.w    int_ret
  62. e_drvctrl:
  63.     move.w    par1+8(sp),d1    * COM
  64.     bmi    curdrv
  65.  
  66.     moveq    #0,d0        * DRVNAME get
  67.     tst.w    par2(sp)
  68.     bmi    @f
  69.     movea.l    par2+6(sp),a0
  70.     move.b    (a0)+,d0
  71.     beq    drvname_err
  72.     ori.b    #$20,d0
  73.     subi.b    #'a'-1,d0
  74.     bcs    drvname_err
  75.     cmpi.b    #26,d0
  76.     bhi    drvname_err
  77.     cmpi.b    #':',(a0)
  78.     bne    drvname_err
  79. @@:
  80.  * d0 = 0(カレント), 1(A:), 2(B:), ...
  81.  
  82.  
  83.     cmpi.w    #6,d1
  84.     beq    chgdrv
  85.     bhi    media_byte
  86.     move.w    d0,-(sp)    * drive name
  87.     move.b    d1,(sp)        * command
  88.     DOS    _DRVCTRL
  89.     addq.l    #2,sp
  90.     bra    return_d0
  91.  
  92. media_byte:
  93.     lea.l    -96(sp),sp
  94.     move.l    sp,-(sp)
  95.     move.w    d0,-(sp)
  96.     DOS    _GETDPB
  97.     addq.l    #6,sp
  98.     moveq    #0,d0
  99.     move.b    $16(sp),d0    * media byte
  100.     lea.l    96(sp),sp
  101.     bra    return_d0
  102.  
  103. curdrv:
  104.     DOS    _CURDRV
  105.     bra    return_d0
  106. chgdrv:
  107.     subq.w    #1,d0
  108.     bcs    no_drvname
  109.     move.w    d0,-(sp)
  110.     DOS    _CHGDRV
  111.     addq.l    #2,sp
  112.     tst.l    d0
  113.     bge    return_zero
  114.     bra    no_drvname
  115.  
  116.  
  117. p_chgdir:
  118.     .dc.w    str_val
  119.     .dc.w    void_ret
  120. e_chgdir:
  121.     move.l    par1+6(sp),-(sp)
  122.     DOS    _CHDIR
  123.     addq.l    #4,sp
  124.     tst.l    d0
  125.     beq    return_d0
  126.     lea.l    _cant_chgdir(pc),a1
  127.     rts
  128.  
  129. p_curdir:
  130.     .dc.w    str_omt
  131.     .dc.w    str_ret
  132. e_curdir:
  133.     tst.w    par1(sp)
  134.     bmi    cur_drive
  135.     movea.l    par1+6(sp),a0
  136.     move.b    (a0)+,d2
  137.     beq    drvname_err
  138.     ori.b    #$20,d2
  139.     subi.b    #'a'-1,d2
  140.     bcs    drvname_err
  141.     cmpi.b    #26,d2
  142.     bhi    drvname_err
  143.     cmpi.b    #':',(a0)
  144.     beq    @f
  145.     bra    drvname_err
  146.  
  147. cur_drive:
  148.     DOS    _CURDRV
  149.     addq.w    #1,d0
  150.     move.w    d0,d2
  151. @@:
  152.     lea.l    -$100(sp),sp
  153.     move.l    sp,-(sp)
  154.     move.w    d2,-(sp)    * drive 番号
  155.     DOS    _CURDIR        * H8/12/10 今まで気付かなかったとは……情けない
  156.     addq.l    #6,sp
  157.     tst.l    d0
  158.     bmi    curdir_err
  159.  
  160.     lea.l    strbuf(pc),a1
  161.     addi.w    #'A'-1,d2
  162.     move.b    d2,(a1)+
  163.     move.b    #':',(a1)+
  164.     move.b    #'\',(a1)+
  165.  
  166.     movea.l    sp,a0
  167. @@:
  168.     move.b    (a0)+,(a1)+
  169.     bne    @b
  170.  
  171.     lea.l    $100(sp),sp
  172.     lea.l    strbuf(pc),a1
  173.     bra    return_a1
  174.  
  175. curdir_err:
  176.     lea.l    $100(sp),sp
  177.     bra    drvname_err
  178.  
  179.  
  180. **    **    **    **    **    **    **    **    **    **
  181.  
  182. p_filesnum:
  183.     .dc.w    str_val        * filename
  184.     .dc.w    int_val        * attrib
  185.     .dc.w    int_ret
  186. e_filesnum:
  187.     lea.l    filbuf(pc),a2
  188.     move.w    par2+8(sp),-(sp)
  189.     move.l    2+par1+6(sp),-(sp)
  190.     move.l    a2,-(sp)
  191.     DOS    _FILES
  192.     lea.l    10(sp),sp
  193.     tst.l    d0
  194.     bmi    return_zero    * ファイルがない
  195.     moveq    #0,d1        * ファイル個数
  196. @@:
  197.     addq.w    #1,d1
  198.     move.l    a2,-(sp)
  199.     DOS    _NFILES
  200.     addq.l    #4,sp
  201.     tst.l    d0
  202.     beq    @b
  203.     move.l    d1,d0
  204.     bra    return_d0
  205.  
  206.  
  207.  
  208. p_files:
  209.     .dc.w    str_val        * name
  210.     .dc.w    int_val        * attrib
  211.     .dc.w    $0038        * filenames (文字列型 1 次元配列)
  212.     .dc.w    ary1_i        * filesizes
  213.     .dc.w    ary1_i        * filedate×
  214.     .dc.w    ary1_c        * fileattribs
  215.     .dc.w    int_ret
  216. e_files:
  217.     lea.l    filbuf(pc),a2
  218.     move.w    par2+8(sp),-(sp)
  219.     move.l    2+par1+6(sp),-(sp)
  220.     move.l    a2,-(sp)
  221.     DOS    _FILES
  222.     lea.l    10(sp),sp
  223.     tst.l    d0
  224.     bmi    return_zero    * ファイルがない
  225.  
  226.     movea.l    par3+6(sp),a3
  227.     movea.l    par4+6(sp),a4
  228.     movea.l    par5+6(sp),a5
  229.     movea.l    par6+6(sp),a6
  230.     move.w    8(a3),d1    * 要素数
  231.     cmp.w    8(a4),d1
  232.     bne    要素数違う
  233.     cmp.w    8(a5),d1
  234.     bne    要素数違う
  235.     cmp.w    8(a6),d1
  236.     bne    要素数違う
  237.     move.w    6(a3),d2    * str filenames() の各項のデータサイズ
  238.     moveq    #10,d0
  239.     adda.l    d0,a3
  240.     adda.l    d0,a4
  241.     adda.l    d0,a5
  242.     adda.l    d0,a6
  243.  
  244. files_loop:
  245.     lea.l    30(a2),a0    * filename
  246.     movea.l    a3,a1
  247.     move.w    d2,d0
  248.     subq.w    #1,d0
  249. @@:
  250.     move.b    (a0)+,(a1)+
  251.     dbeq    d0,@b
  252.     clr.b    (a1)
  253.     lea.l    (a3,d2.w),a3    * 次の項
  254.  
  255.     move.l    26(a2),(a4)+    * filesize
  256.     move.l    22(a2),d0    * filedate&time
  257.     swap    d0
  258.     move.l    d0,(a5)+
  259.     move.b    21(a2),(a6)+    * fileattrib
  260.  
  261.     move.l    a2,-(sp)
  262.     DOS    _NFILES
  263.     addq.l    #4,sp
  264.     tst.l    d0
  265.     dbne    d1,files_loop
  266.     bne    return_zero
  267.     moveq    #1,d0        * 全ては格納出来なかった
  268.     bra    return_d0
  269.  
  270.  
  271. filbuf:
  272.     .ds.b    56
  273.  
  274.  
  275. **    **    **    **    **    **    **    **    **    **
  276.  
  277. p_setenv:
  278.     .dc.w    str_val
  279.     .dc.w    str_omt
  280.     .dc.w    int_ret
  281. p_getenv:
  282.     .dc.w    str_val
  283.     .dc.w    str_ret
  284. e_setenv:
  285.     move.l    par2+6(sp),a1
  286.     tst.w    par2(sp)
  287.     bge    @f
  288.     suba.l    a1,a1
  289. @@:
  290.     move.l    a1,-(sp)
  291.     clr.l    -(sp)
  292.     move.l    8+par1+6(sp),-(sp)
  293.     DOS    _SETENV
  294.     lea.l    12(sp),sp
  295.     bra    return_d0
  296. e_getenv:
  297.     lea.l    strbuf(pc),a1
  298.     clr.b    (a1)
  299.     move.l    a1,-(sp)
  300.     clr.l    -(sp)
  301.     move.l    8+par1+6(sp),-(sp)
  302.     DOS    _GETENV
  303.     lea.l    12(sp),sp
  304.     bra    return_a1
  305.  
  306.  
  307. **    **    **    **    **    **    **    **    **    **
  308.  
  309. p_system:
  310.     .dc.w    str_val
  311.     .dc.w    int_ret
  312. e_system:
  313.     movea.l    par1+6(sp),a0
  314.     lea.l    -$200(sp),sp
  315.     lea.l    _command(pc),a1
  316.     movea.l    sp,a2
  317. @@:
  318.     move.b    (a1)+,(a2)+
  319.     bne    @b
  320.     move.b    #' ',-1(a2)
  321. @@:
  322.     move.b    (a0)+,(a2)+
  323.     bne    @b
  324.  
  325.     lea.l    $100(sp),a1
  326.     movea.l    sp,a0
  327.  
  328.     clr.l    -(sp)
  329.     movem.l    a0/a1,-(sp)
  330.     move.w    #2,-(sp)
  331.     DOS    _EXEC
  332.     tst.l    d0
  333.     bmi    @f
  334.     clr.w    (sp)
  335.     DOS    _EXEC
  336. @@:
  337.     lea    $200+14(sp),sp
  338.     bra    return_d0
  339.  
  340.  
  341. _command:
  342.     .dc.b    'command.x',0
  343.     .even
  344.  
  345.  
  346.  
  347. *-------------------------
  348.  
  349. return_zero:
  350.     moveq.l    #0,d0
  351. return_d0:
  352.     lea.l    fac(pc),a0
  353.     move.l    d0,6(a0)
  354.     moveq.l    #0,d0
  355.     rts
  356. return_a1:
  357.     lea.l    fac(pc),a0
  358.     move.l    a1,6(a0)
  359.     moveq.l    #0,d0
  360.     rts
  361.  
  362.     .even
  363. fac:
  364.     .dc.w    0
  365.     .dc.l    0
  366.     .dc.l    0
  367. strbuf:
  368.     .ds.b    256
  369. *-----------------------------
  370.  
  371. 要素数違う:
  372.     lea.l    _要素数違う(pc),a1
  373.     moveq    #1,d0
  374.     rts
  375. drvname_err:
  376.     lea.l    _drvname_err(pc),a1
  377.     moveq    #1,d0
  378.     rts
  379. no_drvname:
  380.     lea.l    _no_drvname(pc),a1
  381.     moveq    #1,d0
  382.     rts
  383. _drvname_err:
  384.     .dc.b    'ドライブ名の指定が間違っています',0
  385. _no_drvname:
  386.     .dc.b    'カレントを指定のドライブに変更することができませんでした',0
  387. _cant_chgdir:
  388.     .dc.b    'カレントを指定のディレクトリに変更することができませんでした',0
  389. _要素数違う:
  390.     .dc.b    '指定の配列の要素数が相異なります',0
  391.     .even
  392.     .end
  393.  
  394.  
  395.